#include "Stack.h"

void STInit(ST* ps)
{
    assert(ps);
    
    ps->a = (STDataType*)malloc(sizeof(STDataType) * INIT_CAPACITY);
    if (NULL == ps->a)
    {
        perror("STInit malloc fail");
        return;
    }

    ps->top = 0;
    ps->capacity = INIT_CAPACITY;
}

void STDestroy(ST* ps)
{
    assert(ps);

    free(ps->a);
    ps->a = NULL;
    ps->top = ps->capacity = 0;
}

void STPush(ST* ps, STDataType x)
{
    assert(ps);

    if (ps->capacity == ps->top)
    {
        STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity * 2);
        if (NULL == tmp)
        {
            perror("STPush reallo fail");
            return;
        }
        ps->a = tmp;
        ps->capacity *= 2;
    }

    
    ps->a[ps->top++] = x;
}

void STPop(ST* ps)
{
    assert(ps);
    assert(!STEmpty(ps));

    --ps->top;
}

STDataType STTop(ST* ps)
{
    assert(ps);
    assert(!STEmpty(ps));

    return ps->a[ps->top - 1];
}

int STSize(ST* ps)
{
    assert(ps);

    return ps->top;
}

bool STEmpty(ST* ps)
{
    assert(ps);

    return ps->top == 0;
}